package br.com.vagacerta.controller;

import java.sql.SQLException;
import java.util.List;




import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;

import br.com.vagacerta.modelo.Cidade;
import br.com.vagacerta.modelo.Cliente;
import br.com.vagacerta.modelo.CupomMensalista;
import br.com.vagacerta.modelo.Email;
import br.com.vagacerta.modelo.Endereco;
import br.com.vagacerta.modelo.Estado;
import br.com.vagacerta.modelo.TipoEndereco;
import br.com.vagacerta.modelo.PessoaFisica;
import br.com.vagacerta.modelo.PessoaJuridica;
import br.com.vagacerta.modelo.Telefone;
import br.com.vagacerta.modelo.TipoTelefone;
import br.com.vagacerta.dao.CidadeDAO;
import br.com.vagacerta.dao.ClienteDAO;
import br.com.vagacerta.dao.CupomDAO;
import br.com.vagacerta.dao.EmailDAO;
import br.com.vagacerta.dao.EnderecoDAO;
import br.com.vagacerta.dao.EstadoDAO;
import br.com.vagacerta.dao.PagamentoDAO;
import br.com.vagacerta.dao.TelefoneDAO;
import br.com.vagacerta.dao.TipoServicoDAO;

@Controller
public class ClienteController {

	private final ClienteDAO clienteDAO;
	private final CidadeDAO cidadeDAO;
	private final EstadoDAO estadoDAO;
	private final EnderecoDAO enderecoDAO;
	private final TelefoneDAO telefoneDAO;
	private final EmailDAO emailDAO;
	private final TipoServicoDAO tipoServicoDAO;
	private final CupomDAO cupomDAO;
	private final PagamentoDAO pagamentoDAO;

	@Autowired
 	public ClienteController(ClienteDAO clienteDao, CidadeDAO cidadeDAO,
			TelefoneDAO telefoneDAO, EstadoDAO estadoDAO,
			EnderecoDAO enderecoDAO, EmailDAO emailDAO, TipoServicoDAO tipoServicoDAO, CupomDAO cupomDAO,  PagamentoDAO pagamentoDAO) {
		this.clienteDAO = clienteDao;
		this.cidadeDAO = cidadeDAO;
		this.estadoDAO = estadoDAO;
		this.enderecoDAO = enderecoDAO;
		this.telefoneDAO = telefoneDAO;
		this.emailDAO = emailDAO;
		this.tipoServicoDAO = tipoServicoDAO;
		this.cupomDAO = cupomDAO;
		this.pagamentoDAO = pagamentoDAO;
	}

	@RequestMapping("pesquisaClientePF")
	public String pesquisaClientePF(String txtCodCliente, String nomePF,
			String RG, String CPF, Model model) {

		String codigoCliente = txtCodCliente;
		String nomePessoaFisica = nomePF != "" ? nomePF : null;
		String rg = RG != "" ? RG : null;
		String cpf = CPF != "" ? CPF : null;

		List<PessoaFisica> listaPessoaFisica = clienteDAO.getPessoaFisica(
				codigoCliente, nomePessoaFisica, rg, cpf);
		model.addAttribute("lista", listaPessoaFisica);

		return "cliente/pesquisaClientePF";

	}

	@RequestMapping("pesquisaClientePJ")
	public String pesquisaClientePJ(String txtCodCliente, String nomePJ,
			String CNPJ, String IM, Model model) {

		String codigoCliente = txtCodCliente;
		String razaoSocial = nomePJ != "" ? nomePJ : null;
		String cnpj = CNPJ != "" ? CNPJ : null;
		String im = IM != "" ? IM : null;

		List<PessoaJuridica> listaPessoaJuridica = clienteDAO
				.getPessoaJuridica(codigoCliente, razaoSocial, cnpj, im);
		model.addAttribute("lista", listaPessoaJuridica);

		return "cliente/pesquisaClientePJ";

	}

	@RequestMapping("incluirCliente")
	public String incluirCliente(Model model) {

		model.addAttribute("listaTipoTelefone",
				telefoneDAO.getListaTipoTelefone());
		model.addAttribute("listaEstado", estadoDAO.getListaEstado());
		model.addAttribute("listaTipoEndereco",
				enderecoDAO.getListaTipoEndereco());

		return "cliente/IncluirCliente";

	}

	@RequestMapping(value = "incluiClientePF", method = RequestMethod.POST)
	public @ResponseBody
	int incluiNovoClientePF(String nomePF, String RG, String CPF,
			String tipoEnd, String logradouro, String num, String complemento,
			String bairro, String cidade, String estado, String tpTel1,
			String txtTel1, String tpTel2, String txtTel2, String tpTel3,
			String txtTel3, String email1, String email2, String email3) {

		if (!clienteDAO.pesquisaClienteCPF(CPF)) {

			// Cria e popula Objeto Telefones
			Telefone[] telefones = new Telefone[3];
			String[] tipoTel = { tpTel1, tpTel2, tpTel3 };
			String[] txtTel = { txtTel1, txtTel2, txtTel3 };

			for (int i = 0; i < 3; i++) {
				if (tipoTel[i] != null && !tipoTel[i].isEmpty()) {
					telefones[i] = new Telefone();
					telefones[i].setNumeroTelefone(txtTel[i]);

					TipoTelefone tipoTelefone = telefoneDAO
							.retornaTipoTelefoneporId(Long
									.parseLong(tipoTel[i]));

					telefones[i].setTipoTelefone(tipoTelefone);

				}

			}

			// Cria e popula Objeto Emails
			String arrEmails[] = { email1, email2, email3 };
			Email[] emails = new Email[3];

			for (int z = 0; z < 3; z++) {
				if (arrEmails[z] != null && !arrEmails[z].isEmpty()) {
					emails[z] = new Email();
					emails[z].setEmail(arrEmails[z]);
				}

			}

			// Cria e popula Objeto Estado
			Estado objEstado = estadoDAO.consultaEstadoPorSigla(estado);

			// Verifica a existencia da cidade no BD, senao existir cria o
			// registro no BD
			// e depois popula OBj
			Cidade objCidade = new Cidade();

			if (!cidadeDAO.existeCidade(cidade)) {
				cidadeDAO.adicionaCidade(cidade, objEstado.getCodigoEstado());
			}

			objCidade = cidadeDAO.consultaCidadePorNome(cidade, objEstado);

			// Cria e popula Objeto Endereco
			Endereco endereco = new Endereco();
			TipoEndereco tipoEndereco = enderecoDAO
					.consultaTipoEndereco(tipoEnd);

			endereco.setLogradouro(logradouro);
			endereco.setNumero(Long.parseLong(num));
			endereco.setComplemento(complemento);
			endereco.setBairro(bairro);
			endereco.setCidade(objCidade);
			endereco.setTipoEndereco(tipoEndereco);

			// Cria e popula a Pessoa Fisica
			PessoaFisica pf = new PessoaFisica();

			pf.setCodigoTipoPessoa(1);
			pf.setNome(nomePF);
			pf.setRg(RG);
			pf.setCpf(CPF);
			pf.setStatusCliente((short) 0);
			pf.setEmails(emails);
			pf.setTelefones(telefones);
			pf.setEndereco(endereco);

			clienteDAO.incluiCliente(pf);

			return 1;

		}

		return 0;

	}

	@RequestMapping(value = "incluiClientePJ", method = RequestMethod.POST)
	public @ResponseBody
	int incluiNovoClientePJ(String NomePJ, String CNPJ, String IM,
			String tipoEnd, String logradouro, String num, String complemento,
			String bairro, String cidade, String estado, String tpTel1,
			String txtTel1, String tpTel2, String txtTel2, String tpTel3,
			String txtTel3, String email1, String email2, String email3) {

		if (!clienteDAO.pesquisaClienteCNPJ(CNPJ)) {

			// Cria e popula Objeto Telefones
			Telefone[] telefones = new Telefone[3];
			String[] tipoTel = { tpTel1, tpTel2, tpTel3 };
			String[] txtTel = { txtTel1, txtTel2, txtTel3 };

			for (int i = 0; i < 3; i++) {
				if (tipoTel[i] != null && !tipoTel[i].isEmpty()) {
					telefones[i] = new Telefone();
					telefones[i].setNumeroTelefone(txtTel[i]);

					TipoTelefone tipoTelefone = telefoneDAO
							.retornaTipoTelefoneporId(Long
									.parseLong(tipoTel[i]));

					telefones[i].setTipoTelefone(tipoTelefone);

				}

			}

			// Cria e popula Objeto Emails
			String arrEmails[] = { email1, email2, email3 };
			Email[] emails = new Email[3];

			for (int z = 0; z < 3; z++) {
				if (arrEmails[z] != null && !arrEmails[z].isEmpty()) {
					emails[z] = new Email();
					emails[z].setEmail(arrEmails[z]);
				}

			}

			// Cria e popula Objeto Estado
			Estado objEstado = estadoDAO.consultaEstadoPorSigla(estado);

			// Verifica a existencia da cidade no BD, senao existir cria o
			// registro no BD
			// e depois popula OBj
			Cidade objCidade = new Cidade();

			if (!cidadeDAO.existeCidade(cidade)) {
				cidadeDAO.adicionaCidade(cidade, objEstado.getCodigoEstado());
			}

			objCidade = cidadeDAO.consultaCidadePorNome(cidade, objEstado);

			// Cria e popula Objeto Endereco
			Endereco endereco = new Endereco();
			TipoEndereco tipoEndereco = enderecoDAO
					.consultaTipoEndereco(tipoEnd);

			endereco.setLogradouro(logradouro);
			endereco.setNumero(Long.parseLong(num));
			endereco.setComplemento(complemento);
			endereco.setBairro(bairro);
			endereco.setCidade(objCidade);
			endereco.setTipoEndereco(tipoEndereco);

			// Cria e popula a Pessoa Fisica
			PessoaJuridica pj = new PessoaJuridica();

			pj.setCodigoTipoPessoa(2);
			pj.setRazaoSocial(NomePJ);
			pj.setCnpj(CNPJ);
			pj.setIm(IM);
			pj.setStatusCliente((short) 0);
			pj.setEmails(emails);
			pj.setTelefones(telefones);
			pj.setEndereco(endereco);

			clienteDAO.incluiCliente(pj);

			return 1;

		}

		return 0;

	}

	@RequestMapping(value = "excluiClientePF", method = RequestMethod.POST)
	public @ResponseBody
	String excluiClientePF(@RequestParam(value = "arrayIdCliente", required = false) String[] arrayIdCliente) {
		try {
			for (String id : arrayIdCliente) {
				if(!cupomDAO.existeCupomEmitidoParaCliente(Long.parseLong(id))) {
				emailDAO.excluiEmailPorIdCliente(Long.parseLong(id));
				telefoneDAO.excluiTelefonePorIdCliente(Long.parseLong(id));
				enderecoDAO.excluiEnderecoPorIdCliente(Long.parseLong(id));
				clienteDAO.excluiClientePorId(Long.parseLong(id), 1);
				} else {
					
					return "CUPOM EMITIDO";
				}
			}
			return "OK";

		} catch (SQLException e) {
			return "NOK";
		}
	}

	@RequestMapping(value = "excluiClientePJ", method = RequestMethod.POST)
	public @ResponseBody
	String excluiClientePJ(
			@RequestParam(value = "arrayIdCliente", required = false) String[] arrayIdCliente) {
		try {
			for (String id : arrayIdCliente) {
				emailDAO.excluiEmailPorIdCliente(Long.parseLong(id));
				telefoneDAO.excluiTelefonePorIdCliente(Long.parseLong(id));
				enderecoDAO.excluiEnderecoPorIdCliente(Long.parseLong(id));
				clienteDAO.excluiClientePorId(Long.parseLong(id), 2);
			}

			return "OK";
		} catch (SQLException e) {
			return "NOK";
		}
	}

	@RequestMapping(value = "consultaCliente", method = RequestMethod.GET, params = "idCliente")
	public String consultarCliente(@RequestParam("idCliente") String idCliente,
			Model model) {

		Cliente cliente = clienteDAO.consultaClientePorId(Long.parseLong(idCliente));
		boolean existePagamento = false;

		if (cliente.getCodigoTipoPessoa() == 1) {
			
			
			PessoaFisica pf = (PessoaFisica) cliente;
			model.addAttribute("cliente", pf);
			
			
		} else if (cliente.getCodigoTipoPessoa() == 2) {

			PessoaJuridica pj = (PessoaJuridica) cliente;
			model.addAttribute("cliente", pj);

		}
		
		if(cliente.getStatusCliente() == 1) {
			
			CupomMensalista cupom = cupomDAO.retornaCupomMensalistaPorIdCliente(cliente.getCodigoCliente());
			
			existePagamento = pagamentoDAO.existePagamentoAtivoPorCodigoCupom(cupom.getCodigoCupom());
			
		}
		
			model.addAttribute("listaTipoServico", tipoServicoDAO.getListaTiposervico());
			model.addAttribute("existePagamento", existePagamento);
			
		
		return "cliente/ConsultaCliente";

	}
	
	@RequestMapping(value = "ativaCliente", method = RequestMethod.POST)
	public @ResponseBody int ativaCliente(String tpServico, String codCliente){
		try{
		clienteDAO.ativaClientePorId(Long.parseLong(codCliente));
		cupomDAO.geraCupomClienteMensalista(Long.parseLong(tpServico), Long.parseLong(codCliente));
		return 1;
		
		} catch (SQLException e){
		
			return 0;		
		}

	}

}
